package cn.chinaunicom.sdsi.frm.workflow.component;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

import cn.chinaunicom.sdsi.frm.workflow.bean.BaseTaskVO;
import cn.chinaunicom.sdsi.frm.workflow.bean.HistoicFlowVO;
import cn.chinaunicom.sdsi.frm.workflow.bean.ProcInstInfo;
import cn.chinaunicom.sdsi.frm.workflow.bean.WorkflowEntityForStart;

/**
 * 工作流封装功能业务组件访问接口
 * 
 * @author liyh
 */
public interface WorkflowManager {

	/**
	 * 原生API将流程定义编码转义至定义唯一编码
	 * 
	 * @param processDefinitionKey
	 *            流程定义key
	 * @return 流程定义唯一编码
	 */
	String convertToDefinitionId(String processDefinitionKey);

	/**
	 * 据流程实例ID获取实例相关信息
	 * 
	 * @param processInstanceId
	 *            流程实例ID
	 * @return 流程实例自定义信息实体
	 */
	ProcInstInfo getProcInstInfo(String processInstanceId);

	/**
	 * 据任务ID获取流程相关基本信息
	 * 
	 * @param taskId
	 *            任务ID
	 * @return 任务基本信息实体
	 */
	BaseTaskVO getBaseTaskVO(String taskId);

	/**
	 * 根据流程实例获取流程图，当前任务停留环节高亮
	 * 
	 * @param processInstanceId
	 *            流程实例ID
	 * @return 图像输入流
	 */
	InputStream getDiagramInputStream(String processInstanceId);

	/**
	 * 据流程实例ID获取业务流转历史
	 * 
	 * @param processInstanceId
	 *            流程实例ID
	 * @return 流转历史集合
	 */
	List<HistoicFlowVO> histoicFlowList(String processInstanceId);

	/**
	 * 流程发起公共方法说明： 1.参数类型WorkflowEntityForStart，每一项均必须填写，流程编码、流程标题、流程发起人等
	 * 2.vars中可以放入流程全局共享的参数 3.必须在vars中传入下环节处理人assignee
	 * 
	 * @param ii
	 *            流程发起时的必传参数
	 * @param vars
	 *            用户流程发起时需要的额外参数
	 * @param comment
	 *            首环节发起意见
	 * @param withdraw
	 *            推进后是否可撤回
	 * @return 流程实例ID
	 */
	String startProcess(WorkflowEntityForStart ii, Map<String, Object> vars, String comment, boolean withdraw);

	/**
	 * 流程发起方法重载方法，可指定目标环节任务Key
	 * 
	 * @param ii
	 *            参数提供实体
	 * @param vars
	 *            用户流程发起时需要的额外参数
	 * @param comment
	 *            首环节发起意见
	 * @param withdraw
	 *            推进后是否可撤回
	 * @param taskDefinitionKey
	 *            目标环节定义key
	 * @return 流程实例ID
	 */
	String startProcess(WorkflowEntityForStart ii, Map<String, Object> vars, String comment, boolean withdraw,
			String taskDefinitionKey);

	/**
	 * 流程推动方法重载，完全依照流程定义流转流程
	 * 
	 * @param taskId
	 *            当前任务的ID
	 * @param processInstanceId
	 *            当前任务所在实例的ID
	 * @param vars
	 *            传入推动流程所需参数
	 * @param comment
	 *            环节处理意见
	 * @param withdraw
	 *            推进后是否可撤回
	 * @return 新产生任务ID数组
	 */
	String[] pushProcess(String taskId, String processInstanceId, Map<String, Object> vars, String comment,
			boolean withdraw);

	/**
	 * 流程推动方法重载，可定义推进至预到达的环节
	 * 
	 * @param taskId
	 *            当前任务ID
	 * @param processInstanceId
	 *            当前任务所在实例的ID
	 * @param vars
	 *            传入推动流程所需参数
	 * @param comment
	 *            环节处理意见
	 * @param withdraw
	 *            推进后是否可撤回
	 * @param taskDefinitionKey
	 *            预跳转到环节在XML文件中的元素定义ID
	 * @return 新产生任务ID数组
	 */
	String[] pushProcess(String taskId, String processInstanceId, Map<String, Object> vars, String comment,
			boolean withdraw, String taskDefinitionKey);

	/**
	 * 流程删除功能，直接将流程终止； 有关业务数据的回滚，业务模块自行处理
	 * 
	 * @param processInstanceId
	 *            流程实例ID
	 * @param taskId
	 *            任务ID
	 * @param deleteReason
	 *            删除原因
	 */
	void deleteProcessIntanceButHistoric(String processInstanceId, String taskId, String deleteReason);

	/**
	 * 任务撤回实现
	 * 
	 * @param taskId
	 *            当前已办任务ID
	 * @param processInstanceId
	 *            实例ID
	 * @return 是否成功
	 */
	boolean withdrawProcess(String taskId, String processInstanceId);

	/**
	 * 简退-退回操作
	 * 
	 * @param processInstanceId
	 *            流程实例ID
	 * @param currentTaskId
	 *            当前进行简退回退操作的任务ID
	 * @param comment
	 *            退回命令
	 * @return 是否回退成功
	 */
	boolean backForQuick(String processInstanceId, String currentTaskId, String comment);

	/**
	 * 简退-推进操作
	 * 
	 * @param processInstanceId
	 *            流程实例ID
	 * @param currentTaskId
	 *            当前进行简退推进操作的任务ID
	 * @param comment
	 *            推进意见
	 * @return 是否推进成功
	 */
	boolean pushForQuick(String processInstanceId, String currentTaskId, String comment);

	/**
	 * 转派功能，当前任务更换处理人，记录流转历史
	 * 
	 * @param taskId
	 *            当前任务ID
	 * @param processInstanceId
	 *            流程实例ID
	 * @param assignee
	 *            预指定处理人
	 * @param comment
	 *            审批意见
	 * @return 新任务ID
	 */
	String turnAssignee(String taskId, String processInstanceId, String assignee, String comment);

	/**
	 * 浏览待办后，为上环节处理人不可撤回打标
	 * 
	 * @param processInstanceId
	 *            实例ID
	 * @param taskId
	 *            任务ID
	 * @return 更新记录数，正常为1
	 */
	int signTask(String processInstanceId, String taskId);

	/**
	 * 判断当前已办环节是否可以撤回
	 * 
	 * @param processInstanceId
	 *            实例
	 * @param taskId
	 *            任务
	 * @return 是否可回撤
	 */
	boolean isCanWithDraw(String processInstanceId, String taskId);

	/**
	 * 是否为简退后的提交首环节
	 * 
	 * @param processInstanceId
	 *            流程实例ID
	 * @param taskId
	 *            任务ID
	 * @return 是否可直接提交至退回环节的退回人
	 */
	boolean isBackForQuick(String processInstanceId, String taskId);

	/**
	 * 查看任务是否已经完成
	 * 
	 * @param taskId
	 *            任务ID
	 * @return 是否已经完成
	 */
	boolean isFinishedTask(String taskId);
}
